#include<bits/stdc++.h>
#define int long long
#define maxn 100100
#define maxm 1000100

using namespace std;

int T;
int n,m,L,V;
struct car{
    int d,v,a;
}c[maxn];

int p[maxn];
int cnt[maxm];

signed main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>T;
    while(T--){
        cin>>n>>m>>L>>V;
        for(int i=0;i<=L;i++) cnt[i]=0;
        int ans=0;
        for(int i=1;i<=n;i++) cin>>c[i].d>>c[i].v>>c[i].a;        
        for(int i=1;i<=m;i++){
            cin>>p[i];
            cnt[p[i]]++;
        }
        for(int i=1;i<=L;i++) cnt[i]+=cnt[i-1];
        for(int i=1;i<=n;i++) {
            if(c[i].v>V){
                if(c[i].d!=0){if(cnt[L]-cnt[c[i].d-1]>0) ans++;}
                else if(cnt[L]>0) ans++;
            }
        }
        if(ans==0) cout<<"0 "<<m<<"\n";
        else cout<<ans<<" "<<m-1<<"\n";
    }
    return 0;
}
/*
#include<bits/stdc++.h>
#define int long long
#define maxn 3100

using namespace std;

const int inf=1e18;

int T;
int n,m,L,V;
int p[maxn];
int ans=0;

struct car{
    int d,v,a;
    double front,end;
    bool chaosu=true;
    int dian[maxn],idx=0;
}c[maxn];

int cnt[maxn];
int cpy[maxn];

void dfs(int x,int res,int p[]){
    if(x==m+1){
        ans=max(ans,res);
        return ;
    }
    for(int i=1;i<=n;i++) cpy[i]=p[i];
    bool flag=true;
    for(int i=1;i<=n;i++){
        if(c[i].chaosu==true){
            for(int j=1;j<=c[i].idx;j++){
                if(c[i].dian[j]==x){
                    p[i]--;
                    if(p[i]==0){
                        flag=false;
                        break;
                    }
                }
            }
        }
        if(flag==false) break;
    }
    if(flag==true) dfs(x+1,res+1,p);
    dfs(x+1,res,cpy);
}

signed main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>T;
    while(T--){
        cin>>n>>m>>L>>V;
        ans=0;
        for(int i=1;i<=n;i++) cnt[i]=0;
        for(int i=1;i<=n;i++){
            cin>>c[i].d>>c[i].v>>c[i].a;
            if(c[i].a<0){
                if(c[i].v<=V) c[i].chaosu=false;
                else{
                    c[i].chaosu=true;
                    c[i].front=c[i].d;
                    double x=1.0*(1.0*V*V-1.0*c[i].v*c[i].v)/(2.0*c[i].a);
                    c[i].end=c[i].front+x;
                }
            }
            else if(c[i].a==0){
                if(c[i].v<=V) c[i].chaosu=false;
                else c[i].chaosu=true,c[i].front=c[i].d,c[i].end=L;
            }
            else{
                double x=1.0*(1.0*V*V-1.0*c[i].v*c[i].v)/(2.0*c[i].a);
                if(c[i].d+x>L) c[i].chaosu=false;
                else{
                    c[i].chaosu=true;
                    c[i].front=c[i].d+x;
                    c[i].end=L;
                }
            }
        }
        for(int i=1;i<=m;i++){
            cin>>p[i];
            for(int j=1;j<=n;j++) if(c[j].chaosu==true){
                if(c[j].a>0){
                    if(c[j].front<1.0*p[i] && c[j].end>=1.0*p[i]) c[j].dian[++c[j].idx]=i,cnt[j]=c[j].idx;
                }
                else if(c[j].a<0){
                    if(c[j].front<=1.0*p[i] && c[j].end>1.0*p[i]) c[j].dian[++c[j].idx]=i,cnt[j]=c[j].idx;        
                }
                else if(c[j].front<=1.0*p[i] && c[j].end>=1.0*p[i]) c[j].dian[++c[j].idx]=i,cnt[j]=c[j].idx;
            }
        }
        for(int i=1;i<=n;i++) if(c[i].idx==0) c[i].chaosu=false;
        int num=0;
        for(int i=1;i<=n;i++) if(c[i].chaosu==true) num++; 
        
        // for(int i=1;i<=n;i++){
        //     cout<<i<<" ";
        //     if(c[i].chaosu==false) cout<<"wu"<<"\n";
        //     else{
        //         for(int j=1;j<=c[i].idx;j++){
        //             cout<<c[i].dian[j]<<" ";
        //         }
        //         // cout<<c[i].front<<" "<<c[i].end<<" ";
        //         cout<<"\n";
        //     }
        // }
        // for(int i=1;i<=n;i++) cout<<i<<" "<<cnt[i]<<"\n";
        dfs(1,0,cnt);
        cout<<num<<" "<<ans<<"\n";
    }
    return 0;
}
*/